package code11_io.字节流;

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author 黄衡熙
 * @version 1.0
 */
public class Test04_对象输入输出流 {

    public static void main(String[] args) {
        test01();
        test02();
    }

    /**
     * 序列化:将一个Java对象转换成二进制数据,可以通过一个文件存储这个二进制流数据
     */
    public static void test01() {
        User user = new User(1, "admin", "123456");

        try (
                OutputStream out = new FileOutputStream("objs.data");
                ObjectOutputStream oos = new ObjectOutputStream(out);
        ) {
//            oos.writeObject(1);
//            oos.writeObject("admin");
//            oos.writeObject(user);
            List<User> users = new ArrayList<>(Arrays.asList(
                    new User(1, "admin", "111111"),
                    new User(2, "jack", "222222"),
                    new User(3, "tom", "333333"),
                    new User(4, "lucy", "444444"),
                    new User(5, "alice", "555555")
            ));
//            oos.writeObject(users);

            // 由于读取数据的时候,是根据写入的数据条数进行读取的
            // 如果写入时,写入的数据比较多,读取时会比较麻烦
            // 因此,在实际开发中,会将所有的数据封装成一条数据进行写入
            // 可以将所有数据存储到集合中
            List list = new ArrayList();
            list.add(1);
            list.add("admin");
            list.add(user);
            list.add(users);
            oos.writeObject(list);

            oos.flush();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 反序列化:将文件中的二进制流数据转换成Java数据
     */
    public static void test02() {
        try (
                ObjectInputStream in = new ObjectInputStream(new FileInputStream("objs.data"));
        ) {
            // 此处读取的顺序是按照写入的数据的顺序
//            System.out.println(in.readObject());
//            System.out.println(in.readObject());
//            System.out.println(in.readObject());
//            System.out.println(in.readObject());

            // 在写入数据的时候,将多条数据封装到一个List集合中了
            // 因此,在读取数据到时候,可以将这个集合读取出来再进行展示
            List list = (List) in.readObject();
            for (Object obj : list) {
                System.out.println(obj);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }

}